/* 代理模式
由于一个对象不能直接引用另外一个对象，所以需要通过代理对象在这两个对象之间起到中介作用
代理模式就是为目标对象创造一个代理对象，以实现对目标对象的访问
这样就可以在代理对象里增加一些逻辑判断、调用前或调用后执行一些操作，从而实现了扩展目标的功能
火车票代购、房产中介、律师、海外代购、明星经纪人

Target 目标对象，也就是被代理的对象，是具体业务的执行者
Proxy 代理对象，里面会包含一个目标对象的引用，可以实现对访问的扩展和额外处理
*/
export {}
abstract class Star {
  abstract answerPhone(): void;
}

class Angelababy extends Star {
  //是否有空的意思
  available: boolean = false;
  answerPhone(): void {
    console.log('你好,我是Angelababy')
  }
}

class AngelababyAgent implements Star {
  // 让经济人保持一个对angelababy引用
  constructor(private angelababy: Angelababy) {
    this.angelababy = new Angelababy()
  }

  answerPhone(): void {
    console.log('你好,我是Angelababy的经济人')
    if(this.angelababy.available){
      this.angelababy.answerPhone()
    }else{
      console.log('很抱歉,Angelababy没有空')
    }
  }
}

const angelababyAgent = new AngelababyAgent(new Angelababy())
angelababyAgent.answerPhone()
